﻿#include "player.h"
#include <QDebug>
#include <QtCore>
QRectF player::boundingRect() const
{
    return QRectF(-pix_up.width()/2,-pix_up.height()/2,pix_up.width(),pix_up. height());
}
void player::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    if(live)
       painter->drawPixmap(boundingRect().topLeft(),pix_up);


}
void player::timerEvent(QTimerEvent*)
{

}
void player::edge(qreal width,qreal height)//边界控制
{
    if(startX>=width/2||startX<=-width/2)
    {
        vx*=-1;

        //碰到边界，所对应速度分量反向，符合动量定理

        if(startX>width/2)
            startX=width/2;//一旦超过刷新率卡出边界之外，自动归位防止逃逸
        if(startX<-width/2)
            startX=-width/2;
}
    if(startY>=height/2||startY<=-height/2)
    {
        vy*=-1;

    if(startY>height/2)
        startY=height/2;
    if(startY<-height/2)
        startY=-height/2;
}
}
player::player(QObject *parent) : QObject(parent)

{
    pix_up.load(":/RES/io.png");//加载图片
    pix_up = pix_up.scaled(50, 50);//缩放图片大小
}
qreal player::v()
{
    return sqrt(vx*vx+vy*vy);//矢量合成
}
qreal player::f()
{
    return fk*v();//空气阻力公式
}
void player::advance(int phase)//与视图的计时器链接，时刻触发进行速度与坐标的计算
{
    if(live)
    {
    if(vx)
    {
        vx-=f()*(vx/abs(vx));//阻力，符号实现
    }
    if(vy)
    {
        vy-=f()*(vy/abs(vy));
    }
    if(abs(vx)<0.001)//防止小速度的x，y比值造成贴图抖动
        vx=0;
    if(abs(vy)<0.001)
        vy=0;
    qreal are=0;
//    if(vx<0&&vy>0)
//        are=atan(-vx/vy);
//    if(vx>0&&vy>0)
//        are=atan(vx/vy)+1.57;
//    if(vx>0&&vy<0)
//        are=atan(-vx/vy)+3.14;
//    if(vx<0&&vy<0)
//        are=atan(vx/vy)+4.71;

    if(vy<0)
    this->setRotation(atan(-vx/vy)*57.295);
    else
    this->setRotation(atan(-vx/vy)*57.295+180);
                                            //贴图随着速度倾角二转动，弧度制转角度制



    startX+=vx;//差分加速
    startY+=vy;
    setPos(startX,startY);//设置绝对坐标
}
}
